---
title: 容器的本质
description: 容器就是被隔离的进程
---

## 容器（Container）是什么
首先，我们使用 `docker pull` 命令，拉取一个新的镜像—— 操作系统 Alpine
```bash
docker pull alpine
```
然后，我们使用docker run 命令运行它的 Shell 程序：
```bash
docker run -it alpine /bin/sh
```
**这里的 `-it` 参数**会暂时离开当前 Ubuntu 操作系统，进入容器内部
现在，执行 `cat /etc/os-release`，然后再使用 exit 命令退出容器：
```bash
[root@docker ~]# docker run -it alpine sh
/ # cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.18.4
PRETTY_NAME="Alpine Linux v3.18"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"
/ # exit
```
在容器里查看操作系统，发现是 Alpine Linux，已经不是外面的 Ubuntu 操作系统了。

也就是说，在容器内部是一个全新的 Alpine Linux 操作系统，它的文件系统、进程、网络都是独立的，与外面的 Ubuntu 操作系统完全隔离。

这就是容器的本质：**被隔离的进程**。
:::tip 为什么要隔离？
对于 Linux 系统来说，一个不受任何限制的应用程序是十分危险的，它可以随意读写磁盘文件，可以随意访问网络，甚至可以访问主机上的硬件设备。

而现在，使用容器技术，可以让应用程序在一个受到限制的环境里运行，它只能访问自己的文件，也只能访问自己的网络端口，更不能访问主机上的硬件设备。
:::
## 与虚拟机的区别是什么？
容器和虚拟机面对的都是相同的问题，使用的都是虚拟化技术，只是所在的层次不同。

![b734f7d91bda055236b3467bc16f6302](https://img.wkq.pub/img/b734f7d91bda055236b3467bc16f6302.webp)

首先，容器和虚拟机的目的都是隔离资源，保证系统安全，然后是尽量提高资源的利用率。

虚拟机软件也可以把一台物理服务器虚拟成多台逻辑服务器，这些逻辑服务器彼此独立，可以按需分割物理服务器的的资源，为不同的用户所使用。

从实现的角度看，虚拟机虚拟化出来的是硬件，需要在上面安装一个操作系统后才能运行应用程序,而硬件虚拟化和操作系统都比较重，会消耗大量的 CPU 、内存、硬盘等系统资源。这些消耗没有带来任何价值，唯一的好处就是隔离程序非常高，每个虚拟机之间可以做到完全无干扰。

容器则是直接利用了下层的计算机硬件和操作系统，因为比虚拟机少了一层，所以自然就节省 CPU 和内存，非常轻量级，能够更有效的利用硬件资源。不过，由于多个容器公用操作系统内核，应用程序的隔离程度就没有虚拟机那么高了。

**资源的利用率**，可以说是容器相比于虚拟机最大的优势，

|            | 实现方式                       | 优势                     | 劣势               |
| ---------- | ------------------------------ | ------------------------ | ------------------ |
| **虚拟机** | 虚拟化硬件                     | 隔离程度非常高           | 资源消耗大，启动慢 |
| **容器**   | 直接利用宿主机的硬件和操作系统 | 资源利用率高，运行速度快 | 隔离程度较低       |

## 隔离是怎么实现的

Linux 操作系统内核之后，为资源隔离提供了三种技术：`namespace`、`cgroup`、`chroot`，虽然这三种技术的初衷并不是为了实现容器，但它们三个结合在一起就会发生奇妙的化学反应。

`namespace`可以创建出独立的文件系统、主机名、进程号、网络等资源空间，相当于给进程盖了一间房，这样就实现了系统全局资源和进程局部资源的隔离。

`cgroup` 的全称是 Linux Control Group，用来实现对进程的 CPU、内存等资源的限制，相当于给进程加上了手铐脚镣，这样就实现了对进程资源的限制。

`chroot` 可以更改进程的根目录，也就是限制访问文件系统。

综合利用这三种技术，具有完善的隔离特性的容器就此诞生了。


## 小结
1. 容器就是操作系统里的一个特殊的”沙盒“环境，里面运行的进程只能看到受限的信息，与外部系统实现了隔离。
2. 容器隔离的目的是为了系统安全，限制了进程能够访问的各种资源。
3. 相比虚拟机技术，容器更加轻巧、更加高效，消耗的系统资源非常少。
4. 容器的基本实现技术是 Linux 的 namespace、cgroup 和 chroot。
